package com.cn.zy.zheda.demo.controller;

import org.springframework.web.bind.annotation.RestController;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * 收发信息类 TODO
 *
 * @author zhangyi
 * @date 2018/12/19 14:57
 */
@RestController
@ServerEndpoint(value = "/hi")
@Deprecated
public class WebSocketController {
    /**
     * 查看当前的在线个数
     */
    private static int currentCount = 0;

    /**
     * 复制一个副本对去进行set对象
     */
    private static CopyOnWriteArraySet<WebSocketController> webSocketSet = new CopyOnWriteArraySet<>();

    /**
     * 与客户端连接时候，发送给客户端数据
     */
    private Session session;


    /**
     * 调用成功时候的方法，在用户连接到webSocket上面，会创建一个新的session，这个可以获取当前的在线用户量
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSocketSet.add(this);
        addCurrent();
        System.out.println("有新的连接加入");
    }


    /**
     *  在用户关闭这个链接的时候调用此方法，表明此用户退出此次会话中
     */
    @OnClose
    public void onClose() {
        webSocketSet.remove(this);
        subCurrent();
        System.out.println("有一个线程关闭");
    }

    /**
     * 发送信息
     *
     * @param message
     * @param session
     * @throws IOException
     */
    @OnMessage
    public synchronized void onMessage(String message, Session session) throws IOException {
        System.out.println("客户端发送来的消息：" + message);
        //异步发送给客户端消息
//         this.session.getAsyncRemote().sendText("service already get message:"+message+"<br/>");
        //群发消息
        WebSocketController.sendInfo("server already get message: "
                +message+
                "<br/>当前用户个数: " + getCurrentCount()+"<br/>");
    }

    /**
     * 群发自定义消息
     */
    public static void sendInfo(String message) throws IOException {
        for (WebSocketController item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                continue;
            }
        }
    }

    /**
     * 同步发送消息
     *
     * @param message
     * @throws IOException
     */
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }

    /**
     * 消息发送错误的时候，调用此方法
     *
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发送错误");
        error.printStackTrace();
    }

    /**
     * 获取当前链接数量
     *
     * @return
     */
    public Integer getCurrentCount() {
        return currentCount;
    }

    /**
     * 安全加
     */
    public static synchronized void addCurrent() {
        currentCount++;
    }

    /**
     * 安全减
     */
    public static synchronized void subCurrent() {
        currentCount--;
    }
}
